package com.whale.cloud.util.jdbc;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.whale.cloud.util.jdbc.DruidDataSourceProperties;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/** Created by xdl on 2017/5/26. 数据源配置信息 */
@Configuration
@ConditionalOnClass({DruidDataSource.class})
@ConditionalOnProperty(
  name = {"spring.datasource.type"},
  havingValue = "com.alibaba.druid.pool.DruidDataSource",
  matchIfMissing = true
)
@EnableConfigurationProperties(DruidDataSourceProperties.class)
public class DataSourceConfig {

  //  @Bean(name = "primaryDataSource")
  //  @Qualifier("primaryDataSource")
  //  @Primary
  //  @ConfigurationProperties(prefix = "spring.datasource.primary")
  //  public DataSource primaryDataSource() {
  //    return DataSourceBuilder.create().build();
  //  }
  //
  //  @Bean(name = "secondaryDataSource")
  //  @Qualifier("secondaryDataSource")
  //  @ConfigurationProperties(prefix = "spring.datasource.secondary")
  //  public DataSource secondaryDataSource() {
  //    return DataSourceBuilder.create().build();
  //  }

  /**
   * return DataSourceBuilder.create(getClassLoader()).type(getType())
   * .driverClassName(determineDriverClassName()).url(determineUrl())
   * .username(determineUsername()).password(determinePassword());
   *
   * @param
   * @param druidDataSourceProperties
   * @return
   */
  @Bean(name = "primaryDataSource")
  @Qualifier("primaryDataSource")
  @Primary
  @ConfigurationProperties(prefix = "spring.datasource.primary")
  public DruidDataSource primaryDataSource(DruidDataSourceProperties druidDataSourceProperties) {
    DruidDataSource druidDataSource =
        (DruidDataSource) DataSourceBuilder.create().type(DruidDataSource.class).build();
    druidDataSource.configFromPropety(druidDataSourceProperties.toProperties());
    druidDataSource.setInitialSize(druidDataSourceProperties.getInitialSize());
    druidDataSource.setMinIdle(druidDataSourceProperties.getMinIdle());
    druidDataSource.setMaxActive(druidDataSourceProperties.getMaxActive());
    druidDataSource.setMaxWait(druidDataSourceProperties.getMaxWait());
    druidDataSource.setConnectProperties(druidDataSourceProperties.getConnectionProperties());
    return druidDataSource;
  }

  @Bean(name = "secondaryDataSource")
  @Qualifier("secondaryDataSource")
  @ConfigurationProperties(prefix = "spring.datasource.secondary")
  public DruidDataSource secondaryDataSource(DruidDataSourceProperties druidDataSourceProperties) {
    DruidDataSource druidDataSource =
        (DruidDataSource) DataSourceBuilder.create().type(DruidDataSource.class).build();
    druidDataSource.configFromPropety(druidDataSourceProperties.toProperties());
    druidDataSource.setInitialSize(druidDataSourceProperties.getInitialSize());
    druidDataSource.setMinIdle(druidDataSourceProperties.getMinIdle());
    druidDataSource.setMaxActive(druidDataSourceProperties.getMaxActive());
    druidDataSource.setMaxWait(druidDataSourceProperties.getMaxWait());
    druidDataSource.setConnectProperties(druidDataSourceProperties.getConnectionProperties());
    return druidDataSource;
  }

  @Bean
  public FilterRegistrationBean druidWebStatFilter() {
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
    //添加过滤规则.
    filterRegistrationBean.addUrlPatterns("/*");
    //添加不需要忽略的格式信息.
    filterRegistrationBean.addInitParameter(
        "exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid2/*");
    return filterRegistrationBean;
  }

  @Bean
  public ServletRegistrationBean druidStatViewServlet() {
    //org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.
    ServletRegistrationBean servletRegistrationBean =
        new ServletRegistrationBean(new StatViewServlet(), "/druid/*");

    //添加初始化参数：initParams
    //白名单：
    servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
    //IP黑名单 (存在共同时，deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
    servletRegistrationBean.addInitParameter("deny", "192.168.1.73");
    //登录查看信息的账号密码.
    servletRegistrationBean.addInitParameter("loginUsername", "root");
    servletRegistrationBean.addInitParameter("loginPassword", "password");
    //是否能够重置数据.
    servletRegistrationBean.addInitParameter("resetEnable", "false"); // 禁用HTML页面上的“Reset All”功能
    return servletRegistrationBean;
  }
}
